package com.tedu.API;

import org.junit.Test;

public class StringBuilderAPI {//不能运行，会造成电脑内存大量溢出
   /**
     * 字符串大量拼接：注意String造成内存溢出
     *String str="123"+str;
     *String st="456";
     */
//    @Test
//    public void testString(){
//        String str="字符串";
//        for(int i=0;i<10000000;i++){
//            str=str+i;//字符串1 2 3 4 ·····
//        }
//    }


    /**
     * String-------不可改变对象     BAG（常量池）
     * 假设：拼接出100000000000w个String----内存【开销过大】
     * 操作系统发现内存空间越来越小，回去硬盘上开辟空间----程序、电脑会卡
     *
     * 解决方案：不创建新对象，原来对象实现拼接【添加、替换、插入】
     * StringBuilder对象     可变字符串对象
     * 语法：StringBuilder  sb=new StringBuilder("字符串")
     *
     * C语言    变量   int a=malloc(4); 开辟4个字节空间
     *                 a=1;
     *                 free(a);    清理内存
     *                 不会存在内存溢出
     * Java语言 变量   int a=1  内存开辟a空间，保存1.JVM虚拟机提供GC功能
     *                  会存在内存溢出
     */
    @Test
    public void testSB(){
        //创建1个可变的字符串对象【解决String大量拼接，造成内存溢出】
        String str="你是我的";
        StringBuilder sb=new StringBuilder(str);
        //append方法  添加新字符串，等同于加号【拼接】
        sb.append("小可爱");
        System.out.println(sb);
    }
    //***********************************************
    /**
     * replace方法   替换      返回值：String
     * 作用：可以将字符串中指定范围内“内容”替换成给定的内容
     * 口诀：含头不含尾
     * replace(int start，int end,String str)
     *         开示位置    结束位置，替换内容
     */
    @Test
    public void testReplace(){
        //创建StringBuilder可变字符串类,可在构造器中直接穿字符串
        StringBuilder sb=new StringBuilder("你就是我的小可爱···");
        sb.replace(5,8,"小宝贝");
        System.out.println(sb);
    }
    /**
     * insert方法        插入         返回值String
     * 作用：将给定的字符串插入到当前字符串的某个位置
     * insert(in index,String str)
     *       插入位置， 插入内容
     */
    @Test
    public void testInsert(){
        //创建  可变的字符串对象
        StringBuffer sb=new StringBuffer("你就是我的小可爱···");
        sb.insert(0,"今天");
        System.out.println(sb);
    }
    /**
     * StringBuilder和StringBuffer的区别？
     * StringBuilder和StringBuffer-----方法完全一致【追加，替换，插入】
     * StringBuffer-----JDK1.5-----线程安全【运行效率低】
     * StringBuilder----JDK1.0-----线程不安全【运行效率高】   （首选）   抛错后再换
     *
     * 需求说明书：模块用什么类【标注】    业务
     *
     */
}
